14. 最长公共前缀
14. Longest Common Prefix
Similar Question
leading to the advanced question
Solution Tips
方案
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
// 以第一个字符串为基础遍历, 同时遍历其他多个字符串, 感觉容易溢出
// 字符串有 startWith 方法
// 不应该字母都全都判断一次, 可以直接提取前两个字符串的最长, 如果第三个不符合再回退?
// 1和2的最长公共, 再和3找出最长公共, 直到最后
// 也可以看做二维数组, 每次遍历一列
let prefix = strs[0];
for (let i = 1; i < strs.length; i++) {
const str = strs[i];
// 找出 str 和 prefix 的最长公共前缀, 双指针
prefix = findLCP(prefix, str)
// prefix 为空串了就可以提前退出
}
return prefix;
};
function findLCP(str1, str2) {
let res = '';
for (let i = 0; i < str1.length; i++) {
const char = str1[i];
if (char === str2[i]) {
res += char;
}
else {
return res;
}
}
return res;
}
console.log(longestCommonPrefix(["flower","flow","flight"]))
console.log(longestCommonPrefix(["dog","racecar","car"]))
方案二: 垂直比较
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
let prefix = ''
let min = Math.MAX_SAFE_INTEGER
if(strs.length <= 1) return strs[0] || ""
// 先找出最短的字符串
for (let i = 0; i < strs.length; i++) {
let currentLength = strs[i].length
if(currentLength < min){
min = currentLength
}
}
// 左对齐,垂直比较
for (let j = 0; j < min; j++) {
let current = strs[0][j]
for (let i = 0; i < strs.length; i++) {
if(strs[i][j] !== current){
return prefix
}
}
prefix += strs[0][j]
}
return prefix || ""
};
方案三: 字典序
var longestCommonPrefix = function (strs) {
let prefix = ''
if (!strs) return ''
strs.sort()
console.log(strs)
// 默认按照unicode码排序,排序之后,比较第一个和最后一个即可
last = strs[strs.length - 1]
if(!last) return ''
lastLen = last.length
length = Math.min(strs[0].length, lastLen)
for (let i = 0; i < length; i++) {
if (strs[0][i] === last[i]) {
prefix += strs[0][i]
}else{
return prefix || ''
}
}
return prefix || ''
};
console.log(longestCommonPrefix(['abc','abb']))
- 因为 JS 的 Math 方法只接受 Number 序列作为参数,所以不可以像 Python 一样,不过可以使用 sort 方法替代